// 内容提取器 - 从网页中提取文章内容

// 从当前网页提取文章主体内容
export function extractArticleContent() {
  // 尝试使用多种选择器策略提取内容
  const content = tryMultipleSelectors() || fallbackToMainContent();

  if (!content || content.trim().length === 0) {
    return null;
  }

  // 清理内容，移除广告和不必要的元素
  return cleanContent(content);
}

// 尝试多种常见的文章容器选择器
function tryMultipleSelectors() {
  // 常见的文章内容容器选择器
  const selectors = [
    "article",
    ".article",
    ".post",
    ".entry",
    ".content",
    ".post-content",
    '[itemprop="articleBody"]',
    ".article-content",
    ".article__content",
    ".main-content",
    ".entry-content",
    "#article",
    "#content",
    "#post-content",
    ".blog-post",
    ".story-body",
  ];

  let bestElement = null;
  let maxTextLength = 0;

  // 遍历所有选择器，查找文本内容最多的元素
  for (const selector of selectors) {
    const elements = document.querySelectorAll(selector);

    for (const element of elements) {
      // 检查元素的文本长度
      const textLength = element.textContent.trim().length;

      // 如果找到更长的文本内容，更新最佳元素
      if (textLength > maxTextLength && textLength > 200) {
        // 至少需要200个字符
        maxTextLength = textLength;
        bestElement = element;
      }
    }
  }

  if (bestElement) {
    return bestElement.outerHTML;
  }

  return null;
}

// 备用策略：提取页面主体内容
function fallbackToMainContent() {
  // 查找body中最有可能包含主要内容的元素
  const contentElements = findContentElements();

  if (contentElements.length === 0) {
    // 如果没有找到合适的元素，返回整个body内容
    return document.body.innerHTML;
  }

  // 将找到的内容元素组合成HTML字符串
  return contentElements.map((el) => el.outerHTML).join("");
}

// 查找页面中可能包含主要内容的元素
function findContentElements() {
  // 获取所有可能的内容元素
  const allElements = document.body.querySelectorAll(
    "p, h1, h2, h3, h4, h5, h6, ul, ol"
  );
  const contentElements = [];

  // 过滤出可能属于正文的元素
  for (const element of allElements) {
    // 跳过隐藏元素和非直接可见元素
    if (isElementHidden(element)) {
      continue;
    }

    // 跳过只包含少量文本的元素
    if (
      element.textContent.trim().length < 20 &&
      element.tagName.toLowerCase() !== "h1" &&
      element.tagName.toLowerCase() !== "h2"
    ) {
      continue;
    }

    // 跳过导航、页脚、侧边栏等元素
    if (isNavigationOrSidebar(element)) {
      continue;
    }

    contentElements.push(element);
  }

  return contentElements;
}

// 检查元素是否隐藏
function isElementHidden(element) {
  const style = window.getComputedStyle(element);
  return (
    style.display === "none" ||
    style.visibility === "hidden" ||
    parseFloat(style.opacity) === 0
  );
}

// 检查元素是否属于导航、页脚、侧边栏等
function isNavigationOrSidebar(element) {
  const nonContentElements = ["nav", "footer", "aside", "header", "sidebar"];

  // 检查元素本身和所有父元素
  let currentElement = element;
  while (currentElement) {
    // 检查标签名
    if (nonContentElements.includes(currentElement.tagName.toLowerCase())) {
      return true;
    }

    // 检查ID和类名
    const id = currentElement.id.toLowerCase();
    const className = currentElement.className.toString().toLowerCase();

    for (const term of nonContentElements) {
      if (id.includes(term) || className.includes(term)) {
        return true;
      }
    }

    // 检查其他常见的非内容区域标识
    const nonContentIdentifiers = [
      "menu",
      "comment",
      "widget",
      "banner",
      "ad",
      "promo",
    ];
    for (const term of nonContentIdentifiers) {
      if (id.includes(term) || className.includes(term)) {
        return true;
      }
    }

    currentElement = currentElement.parentElement;
  }

  return false;
}

// 清理HTML内容
function cleanContent(html) {
  // 创建一个新的div来处理HTML
  const tempDiv = document.createElement("div");
  tempDiv.innerHTML = html;

  // 移除脚本和样式标签
  const scriptsAndStyles = tempDiv.querySelectorAll(
    "script, style, iframe, noscript"
  );
  for (const element of scriptsAndStyles) {
    element.remove();
  }

  // 移除隐藏的元素
  const allElements = tempDiv.querySelectorAll("*");
  for (const element of allElements) {
    if (isElementHidden(element)) {
      element.remove();
    }
  }

  // 移除具有广告、推广等特定类名或ID的元素
  const adElements = tempDiv.querySelectorAll(
    '[class*="ad-"], [class*="ads-"], [class*="banner"], [id*="ad-"], [id*="ads-"]'
  );
  for (const element of adElements) {
    element.remove();
  }

  // 保留图片元素
  processImages(tempDiv);

  return tempDiv.innerHTML;
}

// 处理图片元素
function processImages(container) {
  const images = container.querySelectorAll("img");

  for (const img of images) {
    // 确保图片有src属性
    if (!img.src) {
      // 尝试从data-src等属性获取图片地址
      const dataSrc =
        img.getAttribute("data-src") ||
        img.getAttribute("data-original") ||
        img.getAttribute("data-lazy-src");
      if (dataSrc) {
        img.src = dataSrc;
      } else {
        // 如果没有找到图片源，移除这个图片
        img.remove();
        continue;
      }
    }

    // 移除图片上的事件处理器
    img.removeAttribute("onclick");
    img.removeAttribute("onload");
    img.removeAttribute("onerror");

    // 保留alt属性以便于图片描述
    if (!img.alt && img.title) {
      img.alt = img.title;
    }

    // 确保图片可见
    img.style.display = "block";
    img.style.maxWidth = "100%";
  }
}
